home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
051-060
/
amok52
/
togglewin
/
togglewin.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
9KB
|
313 lines
(*---------------------------------------------------------------------------
-Programm: ToggleWin
-Autor: Hans Jörg Schmölz
-Adresse: Eulen 2, D-8961 Sulzberg
-Datum: 04.03.1991
-Copyright: PD
-Sprache: Oberon
-Compiler: Amiga Oberon Compiler V1.17.1
-Format: ToggleWin [DepthKey [saAc]]
-Zweck: ToggleWin erleichtert das Hantieren mit Windows.
-Bedienung: Mit der Depth-Taste (default: Enter im 10er-Block) können
können Sie die Windows, über denen sich gerade der Maus-
zeiger befindet, durchblättern.
-Bemerkung: ToggleWin ist eine Variation des PD-Programms KeyMac
auf Oberon-Disk3 von Fridtjof Siebert. Ein Großteil des
Quelltextes wurde einfach übernommen.
-Achtung: Das Programm darf nicht mit der Option SmallData
compiliert werden!
---------------------------------------------------------------------------*)
MODULE ToggleWin;
IMPORT NoGuruRq, BreakRq,
ie: InputEvent,
e: Exec,
es: ExecSupport,
Input,
rq: Requests,
arg: Arguments,
cv: Conversions,
d: Dos,
g: Graphics,
I: Intuition,
L: Layers,
sys: SYSTEM;
(*-----------------------------------------------------------------------
Porzesser-Register:
-----------------------------------------------------------------------*)
CONST
D0 = 0; D1 = 1; D2 = 2; D3 = 3; D4 = 4; D5 = 5; D6 = 6; D7 = 7;
A0 = 8; A1 = 9; A2 =10; A3 =11; A4 =12; A5 =13; A6 =14; A7 =15;
PortName = "ToggleWin.Port";
ReplyName = "ToggleWin.ReplyPort";
(* Qualifiers: *)
shift = 0; alt = 1; ctrl = 2; amiga = 3;
(* Actions: *)
null = 0; depth = 1; activate = 2;
VAR
IDP: e.MsgPortPtr;
IRB: e.IOStdReqPtr;
HandlerStuff: e.InterruptPtr;
HandlerActive,InputOpen: BOOLEAN;
DepthKey : INTEGER;
DepthQual : SET;
MySig: LONGINT;
SigSet: LONGSET;
Me: e.TaskPtr;
ev,Ev: ie.InputEventPtr;
MyMsg: e.Message;
QuitMessage: e.MessagePtr;
MyPort, OldPort: e.MsgPortPtr;
args, argNr: INTEGER;
Action: INTEGER;
Xcoord, Ycoord: INTEGER;
Window: I.WindowPtr;
Layer: g.LayerPtr;
layerinfo: g.LayerInfoPtr;
TYPE
PROC = PROCEDURE();
(*-------------------------------------------------------------------------*)
PROCEDURE Err; BEGIN HALT(20) END Err;
PROCEDURE Usage;
BEGIN
IF rq.Request("ToggleWin Usage:",
"ToggleWin [DepthKey [saAc]]",
"","Cancel") THEN END;
Err;
END Usage;
(*--------------------- Check Qualifier: --------------------------------*)
PROCEDURE CheckQuali(Quali: SET; Qual: SET): BOOLEAN;
(* this checks the specified Keys in Qual (SHIFT,ALT,CTRL,AMIGA) whether *)
(* they are in Quali (left or right is unimportent) or not. *)
BEGIN
RETURN ((shift IN Qual) = (ie.lShift IN Quali) OR (ie.rShift IN Quali))
AND ((alt IN Qual) = (ie.lAlt IN Quali) OR (ie.rAlt IN Quali))
AND ((amiga IN Qual) = (ie.lCommand IN Quali) OR (ie.rCommand IN Quali))
AND ((ctrl IN Qual) = (ie.control IN Quali));
END CheckQuali;
(*-------------------- Initialize Input.device: -------------------------*)
PROCEDURE OpenInput;
BEGIN
IDP := es.CreatePort (NIL,0); IF IDP=NIL THEN Err END;
IRB := es.CreateStdIO(IDP); IF IRB=NIL THEN Err END;
HandlerStuff.data := NIL;
HandlerStuff.node.pri := 51;
IF (e.OpenDevice("input.device",0,IRB,LONGSET{})#0) OR
(IRB.error#0) THEN Err END;
InputOpen := TRUE;
END OpenInput;
(*--------------------- Close Input-Device: -----------------------------*)
PROCEDURE CloseInput;
BEGIN
IF InputOpen THEN e .CloseDevice(IRB) END;
IF IDP#NIL THEN es.DeletePort (IDP) END;
IF IRB#NIL THEN es.DeleteStdIO(IRB) END;
END CloseInput;
(*--------------------------- AddHandler: -------------------------------*)
PROCEDURE AddHandler(handler: PROC);
BEGIN
HandlerStuff.code := handler;
IRB.command := Input.addHandler;
IRB.data := HandlerStuff;
e.DoIO(IRB);
END AddHandler;
(*--------------------------- RemHandler: -------------------------------*)
PROCEDURE RemHandler();
BEGIN
IRB.command := Input.remHandler;
IRB.data := HandlerStuff;
e.DoIO(IRB);
END RemHandler;
(*------------------------ InputHandler: --------------------------------*)
PROCEDURE * MyHandler;
(* $StackChk- $SaveRegs+ *)
VAR c: INTEGER;
q: SET;
BEGIN
ev := sys.REG(A0);
IF Action = activate THEN
e.Signal(Me,SigSet);
END;
Ev := ev;
WHILE ev#NIL DO
IF ev.class=ie.rawkey THEN
c := ev.code; q := ev.qualifier;
IF (c = DepthKey) AND CheckQuali(q, DepthQual) THEN
ev.class:= ie.null;
Action := depth;
e.Signal(Me,SigSet);
END;
END;
ev := ev.nextEvent;
END;
sys.SETREG(D0, Ev);
END MyHandler; (* $StackChk= *)
(*-------------------------------------------------------------------------*)
PROCEDURE GetQuali(VAR Argument: ARRAY OF CHAR): SET;
VAR q: SET;
i: INTEGER;
BEGIN
i := 0; q := {};
LOOP
CASE Argument[i] OF
0X, "0".."9": RETURN q |
"s": INCL(q,shift) |
"a": INCL(q,alt) |
"A": INCL(q,amiga) |
"c": INCL(q,ctrl) |
ELSE Usage END;
INC(i);
END;
END GetQuali;
PROCEDURE GetKey(args: INTEGER; VAR argNr, key: INTEGER; VAR qual: SET);
VAR
Argument: ARRAY 80 OF CHAR;
help: LONGINT;
BEGIN
IF argNr > args THEN RETURN END;
arg.GetArg(argNr, Argument);
IF ~cv.StringToInt(Argument, help) THEN Usage;
ELSIF (help < 0) OR (help > 127) THEN Usage;
ELSE
key := SHORT(help);
qual:= {};
INC(argNr);
IF argNr > args THEN RETURN
ELSE
arg.GetArg(argNr, Argument);
qual:= GetQuali(Argument);
IF qual # {} THEN INC(argNr) END;
END;
END;
END GetKey;
(*------------------------ Intialisation: -------------------------------*)
BEGIN (* ToggleWin *)
HandlerActive := FALSE; InputOpen := FALSE; MySig := -1;
IDP := NIL; IRB := NIL; MyPort := NIL;
NEW(HandlerStuff); IF HandlerStuff=NIL THEN Err END;
Action:= null;
DepthKey := 43H; (* Enter im 10er-Block *)
DepthQual := {};
(*------ Have we already been started? ------*)
OldPort := e.FindPort(PortName);
IF OldPort#NIL THEN
MyPort := es.CreatePort(sys.ADR(ReplyName),0);
IF MyPort=NIL THEN Err END;
MyMsg.node.type := e.message;
MyMsg.replyPort := MyPort;
e.PutMsg(OldPort,sys.ADR(MyMsg));
e.WaitPort(MyPort);
es.DeletePort(MyPort);
MyPort := NIL;
HALT(0);
END;
MyPort := es.CreatePort(sys.ADR(PortName),0);
IF MyPort=NIL THEN Err END;
(*------ Open everything we need: ------*)
OpenInput();
AddHandler(MyHandler);
HandlerActive := TRUE;
Me := e.FindTask(NIL);
MySig := e.AllocSignal(-1);
IF MySig=-1 THEN Err END;
SigSet := LONGSET{MySig};
(*------ Arguments: ------*)
args := arg.NumArgs();
argNr:= 1;
GetKey(args, argNr, DepthKey, DepthQual);
(*GetKey(args, argNr, ExtendKey, ExtendQual); --- für Erweiterungen ---*)
(*------- Main Loop: ---------*)
LOOP
IF MyPort.sigBit IN e.Wait(LONGSET{MyPort.sigBit,MySig}) THEN EXIT
ELSE
layerinfo:= sys.ADR( I.int.activeScreen.layerInfo );
Xcoord:= I.int.activeScreen.mouseX;
Ycoord:= I.int.activeScreen.mouseY;
Layer := L.WhichLayer( layerinfo, Xcoord, Ycoord );
IF Layer # NIL THEN
Window:= Layer.window;
IF Window # NIL THEN
CASE Action OF
depth:
IF Layer = layerinfo.layer
THEN
I.WindowToBack ( Window );
Action:= activate; (* Wird erst beim nächsten Interrupt
durchgeführt. So kann layerinfo vom
System neu initialisiert werden. *)
ELSE
I.WindowToFront ( Window );
I.ActivateWindow( Window );
END;
| activate:
I.ActivateWindow( Window );
Action:= null;
END;
END;
END;
END;
END; (* LOOP *)
CLOSE
IF HandlerActive THEN RemHandler() END;
CloseInput();
IF MySig#-1 THEN e.FreeSignal(MySig) END;
IF MyPort#NIL THEN
e.Forbid();
IF QuitMessage=NIL THEN QuitMessage := e.GetMsg(MyPort) END;
WHILE QuitMessage#NIL DO
e.ReplyMsg(QuitMessage);
QuitMessage := e.GetMsg(MyPort);
END;
es.DeletePort(MyPort);
e.Permit();
END;
END ToggleWin.